<?php

class Ventas extends BaseVentas {
    const TIPO_VTA_EFECTIVA=1;
    const TIPO_VTA_CONDICIONAL=2;

    private $strategy = null;

    /**
     * Metodos que se uitlizan para implementar patron Strategy
     * 
     */
    public function setStrategy(VentasStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function setIdClienteVenta($cliente) {
        $this->id_cliente_venta = $cliente;
    }

    public function setIdTipoVenta($tipoVenta) {
        $this->id_tipo_venta = $tipoVenta;
    }

    public function setIdVenta($idVenta) {
        $this->id_venta = $idVenta;
    }

    public function getIdClienteVenta() {
        return $this->id_cliente_venta;
    }

    public function getIdTipoVenta() {
        return $this->id_tipo_venta;
    }

    public function getIdVenta() {
        return $this->id_venta;
    }

    public function realizarVenta() {
        $cliente = $this->getIdClienteVenta();
        $idVenta = $this->getIdVenta();
        $tipoVta = $this->getIdTipoVenta();
        $vm = VentasManager::getInstance();
        $tiposPago = $vm->getFormasDePago();

        $this->strategy->checkout($cliente, $tipoVta, $idVenta, $tiposPago);
    }

    public function __toString() {
        return $this->getVtaId();
    }

    public function esCondicional() {
        $vtaCond = self::TIPO_VTA_CONDICIONAL;
        $tipoVta = $this->getVtaTipo();
        if ($tipoVta == $vtaCond) {
            return true;
        }
        return false;
    }

    public function getNombreCliente() {
        $cliente = $this->getClientes();
        if (!empty($cliente)) {
            return $cliente->getCliNombre();
        }
        return null;
    }

    public function getTipoVenta() {
        $tipoVenta = $this->getTipoVentas();
        if (!empty($tipoVenta)) {
            return $tipoVenta->getTipVtaNombre();
        }
        return null;
    }

    public function getTotalVenta() {
        return "$ " . $this->getVtaTotal();
    }

    public function getUsuarioVenta() {
        $usuario = $this->getSfGuardUser();
        if (!empty($usuario)) {
            return $usuario->getUsername();
        }
    }

    public function getIvaVenta() {
        $iva = $this->getVtaIva();
        if (!empty($iva)) {
            return $iva . ' %';
        }
        return '--';
    }

    public function getDescuentoVenta() {
        $descuento = $this->getVtaDescuento();
        if (!empty($descuento)) {
            return $descuento . ' %';
        }
        return '--';
    }

    public function getSubtotalVenta() {
        $detalles_venta = $this->getDetalleVentass();
        if (!empty($detalles_venta)) {
            $total = 0;
            foreach ($detalles_venta as $detalle_venta) {
                $precio_final = $detalle_venta->getPrecioVenta() * $detalle_venta->getDetVtaCantidad();
                $total += $precio_final;
            }

            return $total;
        }
        return null;
    }

    public function getPrecioVentaSinDescuento() {
        $tiene_descuento = $this->getVtaDescAplicado();
        $precio_venta = $this->getSubtotalVenta();
        return $precio_venta;
    }

    public function getPrecioVentaConDescuento() {
        $tiene_descuento = $this->getVtaDescAplicado();
        $precio_venta = $this->getSubtotalVenta();

        if ($tiene_descuento != 1) {
            //si tiene descuento aplicado obtener valor de venta
            return round($precio_venta, 2);
        } else {
            //sino  sumar porcentaje de descuento al valor de la venta
            $descuento = $this->getVtaDescuento();
            return round($precio_venta - ($precio_venta * $descuento) / 100, 2);
        }
    }

    public function getTotal() {
        $tiene_descuento = $this->getVtaDescAplicado();
        $precio_venta = $this->getVtaTotal();

        if (!$tiene_descuento) {
            //si tiene descuento aplicado obtener valor de venta
            return round($precio_venta, 2);
        } else {
            //sino  sumar porcentaje de descuento al valor de la venta
            $descuento = $this->getVtaDescuento();
            return round($precio_venta + ($precio_venta * $descuento) / 100, 2);
        }
    }

    public function almacenarVenta($nroFactura, $cliente, $total, $tipoVta, $userId, $iva, $descuento, $tiposPago) {

        try {
            $fecha = date('Y-m-d H:i:s');
            $this->setVtaNroFactura($nroFactura);
            $this->setVtaCliente($cliente);
            $this->setVtaTotal($total);
            $this->setVtaTipo($tipoVta);
            $this->setVtaFecha($fecha);
            $this->setVtaUsuario($userId);
            $this->setVtaIva($iva);
            $this->setVtaDescuento($descuento);

            if (!empty($tiposPago)) {

                $esEfectivo = array_key_exists("efectivo", $tiposPago);
                $esCheque = array_key_exists("cheque", $tiposPago);
                $esCtaCte = array_key_exists("cta_cte", $tiposPago);
                $esTarjeta = array_key_exists("tarjeta", $tiposPago);

                if ($esCheque) {
                    $this->setVtaCheque($tiposPago["cheque"]);
                }
                if ($esCtaCte) {
                    $this->setVtaCtaCte($tiposPago["cta_cte"]);
                }
                if ($esEfectivo) {
                    $this->setVtaEfectivo($tiposPago["efectivo"]);
                }
                if ($esTarjeta) {
                    $this->setVtaTarjeta($tiposPago["tarjeta"]);
                    if (array_key_exists("cuotas", $tiposPago)) {
                        $this->setVtaCuotas($tiposPago["cuotas"]);
                    }
                }
            }

            if ($esEfectivo && !$esCheque && !$esCtaCte && !$esTarjeta) {
                $this->setVtaDescAplicado(true);
            }

            $vta = $this->save();

            return true;
        } catch (sfException $e) {
            return false;
        }
    }

}

